#==============================================================================
# ** COGWHEEL Plug 'n' Play Menu Bars (based on Syvkal's revisions)
#-------------------------------------------------------------------------------
# by DerVVulfman
# Version 1.1
# 06-28-06
#------------------------------------------------------------------------------
# This is a revision of Cogwheel's famous bargraph system, now set as an inser-
# table script to display bargraphs behind values in the menus.
#
# To prevent conflict with Cogwheel's RTAB system, two key definitions have been
# renamed: "gauge_rect" to "cw_gauge" & "gradation_rect" to "cw_grad_rect."
#
#
# Affected Systems:  Main Menu
#                    Skill Menu
#                    Status Menu
#                    Hero Select Menu (for Items & Skills)
#                    Equipment Menu
#                    BattleStatus Menu
#                    
# The system uses a series of CONSTANTS that can be edited here.  They control
# the basic gauge colors and the manner the gauge is filled:

 # Gauge Border Colors
   COG_COLOR1 = Color.new(0, 0, 0, 192)         # Outer Border
   COG_COLOR2 = Color.new(255, 255, 192, 192)   # Inner Border
 # Gauge Empty filler
   COG_COLOR3 = Color.new(0, 0, 0, 192)         # Half of Inner Shading
   COG_COLOR4 = Color.new(64, 0, 0, 192)        # Half of Inner Shading
 # Alignment
   COG_ALIGN1 = 1    # Type 1: (0: Left / 1: Center / 2: Right Justify)
   COG_ALIGN2 = 2    # Type 2: (0: Upper / 1: Central / 2: Lower)
   COG_ALIGN3 = 0    # FILL ALIGNMENT (0: Left Justify / 1: Right Justify)
 # Gauge Settings
   COG_GRADE1 = 1    # EMPTY  gauge (0: Side / 1: Vertical / 2: Slanted)
   COG_GRADE2 = 0    # FILLER gauge (0: Side / 1: Vertical / 2: Slanted)


#==============================================================================
# ** Game_Actor
#------------------------------------------------------------------------------
#  This class handles the actor. It's used within the Game_Actors class
#  ($game_actors) and refers to the Game_Party class ($game_party).
#==============================================================================

class Game_Actor < Game_Battler
 #--------------------------------------------------------------------------
 # * Get EXP - numeric for calculations
 #--------------------------------------------------------------------------  
 def now_exp
  return @exp - @exp_list[@level]
 end
 #--------------------------------------------------------------------------
 # * Get Next Level EXP - numeric for calculations
 #--------------------------------------------------------------------------
 def next_exp
  return @exp_list[@level+1] > 0 ? @exp_list[@level+1] - @exp_list[@level] : 0
 end
 #--------------------------------------------------------------------------
 # * End of Class
 #--------------------------------------------------------------------------
end


#==============================================================================
# ** Window_Base
#------------------------------------------------------------------------------
#  This class is for all in-game windows.
#==============================================================================

class Window_Base < Window
 
 
 #--------------------------------------------------------------------------
 # * Draw EXP w/ Bars
 #     actor : actor
 #     x     : draw spot x-coordinate
 #     y     : draw spot y-coordinate
 #--------------------------------------------------------------------------
 alias draw_actor_exp_original draw_actor_exp
 def draw_actor_exp(actor, x, y, width = 204)
   if actor.next_exp != 0
     rate = actor.now_exp.to_f / actor.next_exp
   else
     rate = 1
   end
   # Calculate Bar Gradiation
   if actor.next_exp != 0
     rate = actor.now_exp.to_f / actor.next_exp
   else
     rate = 1
   end
   # Adjust Bar Color based on Gradiation
   color1 = Color.new(80 - 24 * rate, 80 * rate, 14 * rate, 192)
   color2 = Color.new(100 - 72 * rate, 240 * rate, 62 * rate, 192)
   # Calculate Bar Width
   if actor.next_exp != 0
     exp = width * actor.now_exp / actor.next_exp
   else
     exp = width
   end
   # Draw Bar Graph
   cw_gauge(x, y + 25, width, 10, exp, color1, color2)
   # Call original EXP                
   draw_actor_exp_original(actor, x, y)
 end  
 
 #--------------------------------------------------------------------------
 # * Draw HP w/ Bars
 #     actor : actor
 #     x     : draw spot x-coordinate
 #     y     : draw spot y-coordinate
 #     width : draw spot width
 #--------------------------------------------------------------------------
 alias draw_actor_hp_original draw_actor_hp
 def draw_actor_hp(actor, x, y, width = 144)
   # Calculate Bar Gradiation
   if actor.maxhp != 0
     rate = actor.hp.to_f / actor.maxhp
   else
     rate = 0
   end
   # Adjust Bar Color based on Gradiation
   color1 = Color.new(216 - 24 * rate, 0 * rate, 0 * rate, 192)
   color2 = Color.new(255 * rate, 165 * rate, 0 * rate, 192)
   # Calculate Bar Width
   if actor.maxhp != 0
     hp = width * actor.hp / actor.maxhp
   else
     hp = 0
   end
   # Draw Bar Graph
   cw_gauge(x, y + 25, width, 10, hp, color1, color2)
   # Call original HP
   draw_actor_hp_original(actor, x, y, width)
 end

 #--------------------------------------------------------------------------
 # * Draw SP w/ Bars
 #     actor : actor
 #     x     : draw spot x-coordinate
 #     y     : draw spot y-coordinate
 #     width : draw spot width
 #--------------------------------------------------------------------------
 alias draw_actor_sp_original draw_actor_sp
 def draw_actor_sp(actor, x, y, width = 144)
   # Calculate Bar Gradiation
   if actor.maxsp != 0
     rate = actor.sp.to_f / actor.maxsp
   else
     rate = 1
   end  
   # Adjust Bar Color based on Gradiation
   color1 = Color.new(14 * rate, 80 - 24 * rate, 80 * rate, 192)
   color2 = Color.new(62 * rate, 240 - 72 * rate, 240 * rate, 192)
   # Calculate Bar Width
   if actor.maxsp != 0
     sp = width * actor.sp / actor.maxsp
   else
     sp = width  
   end
   # Draw Bar Graph
   cw_gauge(x + width * 0 / 100, y + 25, width, 10, sp, color1, color2)
   # Call original SP                
   draw_actor_sp_original(actor, x, y, width)
 end

 #--------------------------------------------------------------------------
 # * Draw Parameter w/ Bars
 #     actor : actor
 #     x     : draw spot x-coordinate
 #     y     : draw spot y-coordinate
 #     type  : parameter type (0-6)
 #--------------------------------------------------------------------------
 alias draw_actor_parameter_original draw_actor_parameter
 def draw_actor_parameter(actor, x, y, type)
   # Choose Color & Parameter Type
   case type
   when 0
     e1 = actor.atk
     c6 = Color.new(253, 53, 56, 192)
     c5 = Color.new(242, 2, 6, 192)
   when 1
     e1 = actor.pdef
     c6 = Color.new(238, 254, 124, 192)
     c5 = Color.new(228, 253, 48, 192)
   when 2
     e1 = actor.mdef
     c6 = Color.new(150, 37, 184, 192)
     c5 = Color.new(170, 57, 204, 192)
   when 3
     e1 = actor.str
     c6 = Color.new(253, 163, 33, 192)
     c5 = Color.new(254, 209, 154, 192)
   when 4
     e1 = actor.dex
     c6 = Color.new(255, 255, 255, 192)
     c5 = Color.new(222, 222, 222, 192)
   when 5
     e1 = actor.agi
     c6 = Color.new(124, 254, 155, 192)
     c5 = Color.new(33, 253, 86, 192)
   when 6
     e1 = actor.int
     c6 = Color.new(119, 203, 254, 192)
     c5 = Color.new(8, 160, 253, 192)
   end
   # Calculate Bar Gradiation
   e2 = 999
   if e1.to_f != 0
     rate = e1.to_f / e2.to_f
   else
     rate = 1
   end
   # Adjust Bar Color based on Gradiation & Parameter Type
   for i in 0..7
     r = c6.red * rate
     g = (c6.green - 10) * rate
     b = c6.blue  * rate
     a = c6.alpha
   end
   # Calculate Bar Width
   width = 168
   if e1.to_f != 0
     par = width * e1.to_f / e2.to_f
   else
     par = width
   end
   # Equipment Calc Fix    
   case type
   when 0
     if e1 == 0
       par = 0
     end
   when 1
     if e1 == 0
       par = 0
     end
   when 2
     if e1 == 0
       par = 0
     end
   end
   # Draw Bar Graph
   cw_gauge(x , y + 25, width, 7, par, c5, Color.new(r, g, b, a))
   # Call Original Parameter            
   draw_actor_parameter_original(actor, x, y, type)
 end

 #--------------------------------------------------------------------------
 # * Gauge Rectangle (New to Class)
 #--------------------------------------------------------------------------
 def cw_gauge(x, y, width, height, gauge, color1, color2)

   # Use Cogwheel PRESETS
   color3 = COG_COLOR1
   color4 = COG_COLOR2
   color5 = COG_COLOR3
   color6 = COG_COLOR4
   align1 = COG_ALIGN1
   align2 = COG_ALIGN2
   align3 = COG_ALIGN3
   grade1 = COG_GRADE1
   grade2 = COG_GRADE2
   
   # Create Rectangle Width based on gauge max.
   rect_width = width
   
   case align1
   when 1
     x += (rect_width - width) / 2
   when 2
     x += rect_width - width
   end
   case align2
   when 1
     y -= height / 2
   when 2
     y -= height
   end
   self.contents.fill_rect(x, y, width, height, color3)
   self.contents.fill_rect(x + 1, y + 1, width - 2, height - 2, color4)
   if align3 == 0
     if grade1 == 2
       grade1 = 3
     end
     if grade2 == 2
       grade2 = 3
     end
   end
   if (align3 == 1 and grade1 == 0) or grade1 > 0
     color = color5
     color5 = color6
     color6 = color
   end
   if (align3 == 1 and grade2 == 0) or grade2 > 0
     color = color1
     color1 = color2
     color2 = color
   end
   self.contents.cw_grad_rect(x + 2, y + 2, width - 4, height - 4, color5, color6, grade1)
   if align3 == 1
     x += width - gauge
   end
   self.contents.cw_grad_rect(x + 2, y + 2, gauge - 4, height - 4, color1, color2, grade2)
 end
 
 #--------------------------------------------------------------------------
 # * End of Class
 #--------------------------------------------------------------------------
end


#==============================================================================
# ** Bitmap
#==============================================================================
class Bitmap

 #--------------------------------------------------------------------------
 # * Gradation Rectangle
 #--------------------------------------------------------------------------
 def cw_grad_rect(x, y, width, height, color3, color4, align = 0)
  if align == 0
    for i in x...x + width
      red   = color3.red + (color4.red - color3.red) * (i - x) / (width - 1)
      green = color3.green +
              (color4.green - color3.green) * (i - x) / (width - 1)
      blue  = color3.blue +
              (color4.blue - color3.blue) * (i - x) / (width - 1)
      alpha = color3.alpha +
              (color4.alpha - color3.alpha) * (i - x) / (width - 1)
      color = Color.new(red, green, blue, alpha)
      fill_rect(i, y, 1, height, color)
    end
  elsif align == 1
    for i in y...y + height
      red   = color3.red +
              (color4.red - color3.red) * (i - y) / (height - 1)
      green = color3.green +
              (color4.green - color3.green) * (i - y) / (height - 1)
      blue  = color3.blue +
              (color4.blue - color3.blue) * (i - y) / (height - 1)
      alpha = color3.alpha +
              (color4.alpha - color3.alpha) * (i - y) / (height - 1)
      color = Color.new(red, green, blue, alpha)
      fill_rect(x, i, width, 1, color)
    end
  elsif align == 2
    for i in x...x + width
      for j in y...y + height
        red   = color3.red + (color4.red - color3.red) *
                ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
        green = color3.green + (color4.green - color3.green) *
                ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
        blue  = color3.blue + (color4.blue - color3.blue) *
                ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
        alpha = color3.alpha + (color4.alpha - color3.alpha) *
                ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
        color = Color.new(red, green, blue, alpha)
        set_pixel(i, j, color)
      end
    end
  elsif align == 3
    for i in x...x + width
      for j in y...y + height
        red   = color3.red + (color4.red - color3.red) *
              ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
        green = color3.green + (color4.green - color3.green) *
              ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
        blue  = color3.blue + (color4.blue - color3.blue) *
              ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
        alpha = color3.alpha + (color4.alpha - color3.alpha) *
              ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
        color = Color.new(red, green, blue, alpha)
        set_pixel(i, j, color)
      end
    end
  end
end

 #--------------------------------------------------------------------------
 # * End of Class
 #--------------------------------------------------------------------------
end